# Choose which chapters to compile
option(LIBIGL_TUTORIALS_CHAPTER1 "Compile libigl tutorials chapter 1" ON)
option(LIBIGL_TUTORIALS_CHAPTER2 "Compile libigl tutorials chapter 2" ON)
option(LIBIGL_TUTORIALS_CHAPTER3 "Compile libigl tutorials chapter 3" ON)
option(LIBIGL_TUTORIALS_CHAPTER4 "Compile libigl tutorials chapter 4" ON)
option(LIBIGL_TUTORIALS_CHAPTER5 "Compile libigl tutorials chapter 5" ON)
option(LIBIGL_TUTORIALS_CHAPTER6 "Compile libigl tutorials chapter 6" ON)
option(LIBIGL_TUTORIALS_CHAPTER7 "Compile libigl tutorials chapter 7" ON)
option(LIBIGL_TUTORIALS_CHAPTER8 "Compile libigl tutorials chapter 8" ON)
option(LIBIGL_TUTORIALS_CHAPTER9 "Compile libigl tutorials chapter 9" ON)

# Download tutorial data
include(libigl_tutorial_data)

if(NOT TARGET igl::glfw)
    message(WARNING "Most tutorial executables depend on OpenGL and glfw. Use `cmake -DLIBIGL_GLFW=ON ..`")
endif()

# Chapter 1
if(LIBIGL_TUTORIALS_CHAPTER1)
    igl_add_tutorial(101_FileIO)
    igl_add_tutorial(102_DrawMesh igl::glfw)
    igl_add_tutorial(103_Events igl::glfw)
    igl_add_tutorial(104_Colors igl::glfw)
    igl_add_tutorial(105_Overlays igl::imgui)
    igl_add_tutorial(106_ViewerMenu igl::imgui)
    igl_add_tutorial(107_MultipleMeshes igl::glfw)
    igl_add_tutorial(108_MultipleViews igl::glfw)
    igl_add_tutorial(109_ImGuizmo igl::imgui)
    igl_add_tutorial(110_MshView igl::glfw)
    igl_add_tutorial(111_MatCap igl::glfw igl::stb)
    igl_add_tutorial(112_Selection igl::imgui)
    igl_add_tutorial(113_Shadows igl::imgui igl::stb)
    igl_add_tutorial(114_CustomShader igl::glfw)
endif()

# Chapter 2
if(LIBIGL_TUTORIALS_CHAPTER2)
    igl_add_tutorial(201_Normals igl::glfw)
    igl_add_tutorial(202_GaussianCurvature igl::glfw)
    igl_add_tutorial(203_CurvatureDirections igl::glfw)
    igl_add_tutorial(204_Gradient igl::glfw)
    igl_add_tutorial(205_Laplacian igl::glfw)
    igl_add_tutorial(206_GeodesicDistance igl::glfw)
    igl_add_tutorial(207_PolygonLaplacian igl::glfw)
endif()

# Chapter 3
if(LIBIGL_TUTORIALS_CHAPTER3)
    igl_add_tutorial(301_Slice igl::glfw)
    igl_add_tutorial(302_Sort igl::glfw)
    igl_add_tutorial(303_LaplaceEquation igl::glfw)
    igl_add_tutorial(304_LinearEqualityConstraints igl::glfw)
    igl_add_tutorial(305_QuadraticProgramming igl::glfw)
    igl_add_tutorial(306_EigenDecomposition igl::glfw)
endif()

# Chapter 4
if(LIBIGL_TUTORIALS_CHAPTER4)
    igl_add_tutorial(401_BiharmonicDeformation igl::glfw)
    igl_add_tutorial(402_PolyharmonicDeformation igl::glfw)
    igl_add_tutorial(403_BoundedBiharmonicWeights igl::glfw)
    igl_add_tutorial(404_DualQuaternionSkinning igl::glfw)
    igl_add_tutorial(405_AsRigidAsPossible igl::glfw)
    igl_add_tutorial(406_FastAutomaticSkinningTransformations igl::glfw)
    igl_add_tutorial(407_BiharmonicCoordinates igl::glfw)
    igl_add_tutorial(408_DirectDeltaMush igl::glfw)
    igl_add_tutorial(409_Kelvinlets igl::imgui)
endif()

# Chapter 5
if(LIBIGL_TUTORIALS_CHAPTER5)
    igl_add_tutorial(501_HarmonicParam igl::glfw)
    igl_add_tutorial(502_LSCMParam igl::glfw)
    igl_add_tutorial(503_ARAPParam igl::glfw)
    igl_add_tutorial(504_NRosyDesign igl::glfw igl_copyleft::comiso)
    igl_add_tutorial(505_MIQ igl::glfw igl_copyleft::comiso)
    igl_add_tutorial(506_FrameField igl::glfw igl_copyleft::comiso)
    igl_add_tutorial(507_Planarization igl::glfw)
endif()

# Chapter 6
if(LIBIGL_TUTORIALS_CHAPTER6)
    igl_add_tutorial(601_Serialization igl::glfw igl::xml)
    igl_add_tutorial(602_Matlab igl::glfw igl_restricted::matlab)
    igl_add_tutorial(604_Triangle igl::glfw igl_restricted::triangle)
    igl_add_tutorial(605_Tetgen igl::glfw igl_copyleft::tetgen)
    igl_add_tutorial(606_AmbientOcclusion igl::glfw igl::embree)
    igl_add_tutorial(607_ScreenCapture igl::glfw igl::stb)
    igl_add_tutorial(608_RayTrace igl::stb igl::embree)
    igl_add_tutorial(609_Boolean igl::glfw igl_copyleft::cgal)
    igl_copy_dll(609_Boolean)
    igl_add_tutorial(610_CSGTree igl::glfw igl_copyleft::cgal)
    igl_copy_dll(610_CSGTree)
endif()

# Chapter 7
if(LIBIGL_TUTORIALS_CHAPTER7)
    igl_add_tutorial(701_Statistics igl::glfw)
    igl_add_tutorial(702_WindingNumber igl::glfw)
    igl_add_tutorial(703_Decimation igl::glfw)
    igl_add_tutorial(704_SignedDistance igl::glfw)
    igl_add_tutorial(705_MarchingCubes igl::glfw)
    igl_add_tutorial(706_FacetOrientation igl::glfw igl::embree)
    igl_add_tutorial(707_SweptVolume igl::glfw)
    igl_add_tutorial(708_Picking igl::glfw)
    igl_add_tutorial(709_SLIM igl::glfw)
    igl_add_tutorial(710_SCAF igl::glfw igl_restricted::triangle)
endif()

if(LIBIGL_TUTORIALS_CHAPTER8)
    igl_add_tutorial(801_Subdivision igl::glfw)
    igl_add_tutorial(802_DataSmoothing igl::glfw)
    igl_add_tutorial(803_ShapeUp igl::glfw)
    igl_add_tutorial(804_MarchingTets igl::glfw igl_copyleft::tetgen)
    igl_add_tutorial(805_MeshImplicitFunction igl::glfw igl_copyleft::core)
    igl_add_tutorial(806_HeatGeodesics igl::glfw)
    igl_add_tutorial(807_FastWindingNumber igl::glfw igl_copyleft::cgal)
    igl_copy_dll(    807_FastWindingNumber)
    igl_add_tutorial(808_IterativeClosestPoint igl::glfw)
    igl_add_tutorial(809_ExplodedView igl::glfw)
    igl_add_tutorial(810_BlueNoise igl::glfw)
endif()

if(LIBIGL_TUTORIALS_CHAPTER9)
    igl_add_tutorial(901_VectorFieldSmoothing igl::glfw)
    igl_add_tutorial(902_VectorParallelTransport igl::glfw)
    igl_add_tutorial(903_FastFindSelfIntersections igl::glfw)
    igl_add_tutorial(904_FastFindIntersections igl::glfw)
    igl_add_tutorial(905_Isolines igl::imgui igl::glfw)
    igl_add_tutorial(906_TrimWithSolid igl::glfw igl_copyleft::cgal)
    igl_add_tutorial(907_DynamicAABB igl::glfw)
    igl_add_tutorial(908_IntersectionBlockingDecimation igl::glfw)
endif()
